﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace PlantsZombies.Common.GDI
{
    public class ImageGDI : IDisposable
    {
        public ImageGDI(string imagePath)
        {
            HBitmap = LoadImage(IntPtr.Zero, imagePath, ImageType.IMAGE_BITMAP, 0, 0, (uint)(LoadImageFlags.LR_LOADFROMFILE | LoadImageFlags.LR_CREATEDIBSECTION));
        }
        public ImageGDI(IntPtr hinst,int w,int h)
        {
            HBitmap = LoadImage(hinst, "", ImageType.IMAGE_BITMAP, w, h, (uint)(LoadImageFlags.LR_CREATEDIBSECTION));
        }
        public IntPtr HBitmap { get; private set; }
        public void Dispose()
        {
            if (HBitmap != IntPtr.Zero)
            {
                DeleteObject(HBitmap);
                HBitmap= IntPtr.Zero;
            }
        }
        /// <summary>
        /// 加载图片
        /// </summary>
        /// <param name="hInst">资源实例的句柄，对于文件路径可以设置为 null。</param>
        /// <param name="lpszName">图像的路径或名称。</param>
        /// <param name="uType">图像类型，例如 IMAGE_BITMAP。</param>
        /// <param name="cxDesired">期望的宽度。</param>
        /// <param name="cyDesired"> 期望的高度。</param>
        /// <param name="fuLoad">加载选项，例如 LR_LOADFROMFILE。</param>
        /// <returns></returns>

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad);
        [DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
    }
    public static class ImageType
    {
        /// <summary>
        /// 这个常量用于指示 LoadImage 函数加载的是一个位图（bitmap）。位图是一种常见的图像格式，包含图像的像素数据。
        /// </summary>
        public const uint IMAGE_BITMAP = 0;
        /// <summary>
        /// 使用此常量时，LoadImage 将加载一个图标（icon）。图标是一种特殊的图像格式，常用于表示应用程序的小图标或窗口的小图标。
        /// </summary>
        public const uint IMAGE_ICON = 1;
        /// <summary>
        /// 此常量指示加载的是一个光标（cursor）图像。在Windows中，光标通常用于显示鼠标指针的不同形状和状态。
        /// </summary>
        public const uint IMAGE_CURSOR = 2;
    }
    [Flags]
    public enum LoadImageFlags : uint
    {
        LR_LOADFROMFILE = 0x00000010,//加载文件路径指定的图像。
        LR_CREATEDIBSECTION = 0x00002000,//创建一个DIB（设备独立位图）部分。
        LR_DEFAULTCOLOR = 0x0000, //使用系统默认的颜色方案来加载图像。
        LR_MONOCHROME = 0x0001, //将图像加载为单色位图。
        LR_COLOR = 0x0002, //将图像加载为彩色位图。
        LR_COPYRETURNORG = 0x0004, //返回原始位图的句柄。
        LR_COPYDELETEORG = 0x0008, //复制原始位图并删除原始的。
        LR_LOADTRANSPARENT = 0x0020,// 加载图像时，保留透明色。
        LR_DEFAULTSIZE = 0x0040,// 使用图像的默认大小。
        LR_VGACOLOR = 0x0080,// 使用VGA颜色模式加载图像。
        LR_LOADMAP3DCOLORS = 0x1000, //加载图像时，将图像映射到3D颜色。
        LR_COPYFROMRESOURCE = 0x4000, //从资源中复制图像。
        LR_SHARED = 0x8000, //与调用者共享图像句柄。
    }
}
